package com.lmaos.basetools.dbconn;

import java.sql.Connection;
import java.util.List;
import java.util.Map;

import com.lmaos.basetools.base.SBaseUtils;
import com.lmaos.basetools.base.SParamMap;
import com.lmaos.basetools.dbconn.DBConf.Sql;
/**
 * 
 * @author lmaos
 *
 * <p>作者：张星宇</p>
 * <p>时间：2017年6月16日 下午6:33:48</p>
 * <p>说明:基本数据		</p>
 *
 */
public class BaseDao {
	/** 执行sql 成功*/
	public final static int executeSql_Succ = 1;
	/** 执行sql 失败*/
	public final static int executeSql_Fail = 0;
	/**
	 * 说明：获取Sql配置		<br>
	 * 时间：2017年6月19日 上午11:25:29
	 *
	 * @param groupName sql所属组名
	 * @param sqlName	sql配置名
	 * @return
	 */
	public Sql sql(String groupName,String sqlName){
		Sql sql = DBConn.getSql(groupName, sqlName);
		
		return sql;
	}
	/**
	 * 说明：获取Sql配置		<br>
	 * 时间：2017年6月19日 上午11:25:58
	 *
	 * @param key String key="groupName.sqlName";
	 * @return
	 */
	public Sql sql(String key){
		String[] keys = key.split(".");
		if(keys.length!=2){
			return null;
		}
		return sql(keys[0], keys[1]);
	}
	
	public SqlExecute execute(Object obj,String groupName,String sqlName,Connection conn,Object...params){
		Sql sql = sql(groupName,sqlName);
		if(params==null||params.length==0)
			params = sql.getParams(obj);
		return new SqlExecute(conn, sql.getSql(obj), params, this);
	}
	public SqlExecute execute(String groupName,String sqlName,Connection conn,Object...params){
		Sql sql = sql(groupName,sqlName);
		return new SqlExecute(conn, sql.getSql(null), params, this);
	}
	/**
	 * 说明：查询sql		<br>
	 * 时间：2017年6月19日 上午11:24:30
	 *
	 * @param groupName sql所属组名
	 * @param sqlName	sql配置名
	 * @param conn
	 * @param params	参数集合(如果有必须填写)
	 * @return
	 */
	public List<SParamMap> select(String groupName,String sqlName,Connection conn,Object...params){
		Sql sql = sql(groupName,sqlName);
		return select(sql.getSql(null), conn, params);
	}
	/**
	 * 说明：查询sql		<br>
	 * 时间：2017年6月19日 上午11:24:30
	 *
	 * @param obj
	 * @param groupName sql所属组名
	 * @param sqlName	sql配置名
	 * @param conn
	 * @param params	参数集合(如果不填写则默认从sql配置查找对象中的字段内容并填充)
	 * @return
	 */
	public List<SParamMap> select(Object obj,String groupName,String sqlName,Connection conn,Object...params){
		Sql sql = sql(groupName,sqlName);
		if(params==null||params.length==0)
			params = sql.getParams(obj);
		return select(sql.getSql(obj), conn, params);
	}
	public List<SParamMap> select(String sql,Connection conn,Object...params){
		return DBConn.select(sql, conn, params);
	}
	/**
	 * 说明：执行sql		<br>
	 * 时间：2017年6月19日 上午11:23:32
	 *
	 * @param groupName sql所属组名
	 * @param sqlName	sql配置名
	 * @param conn		db连接
	 * @param params	参数集合(如果有必须填写)
	 * @return
	 */
	public int executeSql(String groupName,String sqlName,Connection conn,Object...params){
		Sql sql = sql(groupName,sqlName);
		return executeSql(sql.getSql(null), conn, params);
	}
	/**
	 * 说明：执行sql		<br>
	 * 时间：2017年6月19日 上午11:19:44
	 *
	 * @param obj
	 * @param groupName sql所属组名
	 * @param sqlName	sql配置名
	 * @param conn		db连接
	 * @param params	参数集合(如果不填写则默认从sql配置查找对象中的字段内容并填充)
	 * @return
	 */
	public int executeSql(Object obj,String groupName,String sqlName,Connection conn,Object...params){
		Sql sql = sql(groupName,sqlName);
		if(params==null||params.length==0)
			params = sql.getParams(obj);
		return executeSql(sql.getSql(obj), conn, params);
	}
	
	public int executeSql(String sql,Connection conn,Object...params){
		return DBConn.update(sql, conn, params)>0?executeSql_Succ:executeSql_Fail;
	}
	
	/**
	 * 说明：动态更新 update语句		<br>
	 * 时间：2017年6月19日 上午11:10:30
	 *
	 * @param object
	 * @param tableName			表名
	 * @param updateMapping
	 * @param where				条件
	 * @param conn
	 * @return
	 */
	public int updateSql(Object object ,String tableName,Map<String, String> updateMapping , String where,Connection conn){
		Sql sql = SqlUtils.toUpdateSql(tableName, updateMapping, where,null);
		return executeSql(sql.getSql(object), conn, sql.getParams(object));
	}
	
	
	public <T>List<T> toTBObjects(List<SParamMap> datas,Class<T> type,Map<String, String> nameMapping){
		
		return SBaseUtils.toSimpleTBObjects(datas, type, nameMapping);
	}
	
	public <T>List<T> select(Connection conn,String groupName,String sqlName,Class<T> type,Map<String, String> nameMapping,Object...params){
		List<SParamMap> datas = select(groupName, sqlName, conn,params);
		List<T> objs = toTBObjects(datas, type, nameMapping);
		return objs;
	}
	/**
	 * 说明：查询一条记录		<br>
	 * 时间：2017年7月7日 下午5:13:30
	 *
	 * @param conn			数据连接
	 * @param groupName		sql配置所属组
	 * @param sqlName		sql配置名
	 * @param type			生成集合子类型
	 * @param nameMapping	字段名映射
	 * @param params		参数
	 * @return
	 */
	public <T>T selectOne(Connection conn,String groupName,String sqlName,Class<T> type,Map<String, String> nameMapping,Object...params){
		List<T> objs = select(conn, groupName, sqlName, type, nameMapping, params);
		if(objs.size()>0){
			return objs.get(0);
		}
		return null;
	}
	/**
	 * 说明：动态创建查询语句		<br>
	 * 时间：2017年9月4日 下午8:01:12
	 *
	 * @param conn			数据链接
	 * @param tableName		表名
	 * @param where			条件
	 * @param type			类型
	 * @param nameMapping	字段名称映射，为null则直接使用字段名获取
	 * @param params		参数
	 * @return
	 */
	public <T>List<T> selectSql(Connection conn,String tableName,String where,Class<T> type,Map<String, String> nameMapping,Object... params){
		Sql sql = SqlUtils.toSimpleSelectSql(tableName, where, DBConn.getDBType(conn));
		List<SParamMap> datas = select(sql.getSql(null), conn, params);
		List<T> objs = toTBObjects(datas, type, nameMapping);
		return objs;
	}
	
	/**
	 * 说明：动态创建查询语句		<br>
	 * 时间：2017年9月4日 下午8:01:12
	 *
	 * @param conn			数据链接
	 * @param tableName		表名
	 * @param where			条件
	 * @param type			类型
	 * @param nameMapping	字段名称映射，为null则直接使用字段名获取
	 * @param params		参数
	 * @return 如果有返回一个对象
	 */
	public <T> T selectSqlOne(Connection conn,String tableName,String where,Class<T> type,Map<String, String> nameMapping,Object... params){
		List<T> objs = selectSql(conn, tableName, where, type, nameMapping, params);
		if(objs.size()>0){
			return objs.get(0);
		}
		return null;
	}
	
	public static Connection getConnection(String name){
		try {
			return DBConn.getConnection(name);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	public static void rollback(Connection conn){
		try {
			if(conn!=null)
				conn.rollback();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static void commit(Connection conn){
		try {
			if(conn!=null)
				conn.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static void close(Connection conn){
		try {
			if(conn!=null){
				conn.close();
			}
		} catch (Exception e) {
		}
	}
	/**
	 * 说明：设置当前事务读数据不锁表		<br>
	 * 时间：2017年6月27日 上午9:57:50
	 *
	 * @param conn
	 */
	public void setMysqlReadNoLock(Connection conn){
		if(DBConn.getDBType(conn).toLowerCase().equals("mysql")){
			executeSql("set session transaction isolation level read uncommitted;", conn);
		}
	}
}
